package com.itany.corejava.code08_常用类.枚举;

/**
 * @author 石小俊
 * @date 2023年04月28日 15:03
 */
public enum Season {
    // 由于枚举类型主要用于限制某个属性的值只能是该类中存在的某些东西
    // 因此,枚举类型的构造方法必须是私有的
    // 不允许外部创建对象,只能在内部创建对象
    // 枚举类型在创建对象时,必须处于枚举类的第一行
    // 创建的对象必须外部可以直接访问,且无法修改,因此修饰符必须是public static final
    // public static final Season SPRING = new Season("春天",1,3);
    // 在枚举中,所有的固定部分的内容均可以省略,枚举会自动添加
    // 所有的修饰符省略
    // 由于只能在内部创建对象,因此该对象一定是当前枚举类,枚举类可以省略
    // 所有创建对象的操作均需要 = new XXX,因此这一块也可以省略
    // 最终格式如下:变量名(构造方法参数)
    // SPRING("春天",1,3);
    // 此时对外使用时,需要几个对象,在枚举中就定义几个对象
    // 如果定义多个对象,则多个对象之间以逗号分割
    SPRING("春天",1,3),
    SUMMER("夏天",4,6),
    AUTUMN("秋天",7,9),
    WINTER("冬天",10,12),
    // 如果没有参数,括号可以省略
    ALL
    ;

    // 理论上,所有类中可以存在的东西,在枚举类中都可以有
    // 可以定义属性、方法、构造方法等
    // 季节
    private String name;
    // 季节开始的月份
    private int startMonth;
    // 季节结束的月份
    private int endMonth;

    // 但是对于构造方法,必须是私有的,不允许外部访问,只能在内部创建对象
    // 由于只能是私有的,因此枚举类的构造函数默认使用private进行修饰
    // 此时构造方法的修饰符可以省略
    Season() {

    }

    Season(String name, int startMonth, int endMonth) {
        this.name = name;
        this.startMonth = startMonth;
        this.endMonth = endMonth;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getStartMonth() {
        return startMonth;
    }

    public void setStartMonth(int startMonth) {
        this.startMonth = startMonth;
    }

    public int getEndMonth() {
        return endMonth;
    }

    public void setEndMonth(int endMonth) {
        this.endMonth = endMonth;
    }
}
